// 全局鉴权中间件
module.exports = (options, app) => {
	return async (ctx, next) => {
		// 获取header头部的token
		const { token } = ctx.header;
		if (!token) {
			ctx.throw(400, '您没有权限访问该接口!');
		}
		// 根据tokne解密，换去用户信息
		let user = {};
		try {
			user = await ctx.checkToken(token);
		} catch (err) {
			let fail =
				err.name === 'TokenExpiredError'
					? 'token 已过期! 请重新获取令牌'
					: 'Token 令牌不合法!';

			ctx.throw(fail);
		}

		// 判断用户是否登录
		let isLogin = await ctx.service.redis.get('user_' + user.id);
		if (!isLogin || isLogin !== token) {
			ctx.throw(400, 'Token 令牌不合法!');
		}
		// 获取当前用户,验证用户是否存在
		user = await app.model.User.findByPk(user.id);
		if (!user) {
			ctx.throw(400, '用户不存在!');
		}
		// 把user信息挂载到全局ctx上
		ctx.authUser = user;
		await next();
	};
};
